Task.h & Task.c
该部分是 RTOS 任务切换的核心逻辑。
总体结构
| 模块 | 功能概述 |
|---|---|
| 任务控制与状态管理 | 保存和切换任务状态(就绪、阻塞、挂起、删除等) |
| 调度器 (Scheduler) | 决定哪个任务获得 CPU 执行权 |
| 延时与节拍处理 | 处理任务延时与系统心跳 (Tick) |
| 挂起与恢复 | 支持任务临时挂起和恢复 |
| 删除与清理机制 | 支持任务删除与清理回调 |
| 空闲任务与CPU统计 | 空闲任务用于系统空转与CPU利用率计算 |
全局变量说明
| 变量名 | 含义 |
|---|---|
currentTask |
当前正在运行的任务 |
nextTask |
下一个将要切换到的任务 |
idleTask |
空闲任务(系统最后运行的任务) |
taskPrioTable[] |
不同优先级的任务队列表 |
schedLockCount |
调度锁计数(防止中断时调度) |
taskDelayList |
延时队列(存放处于延时状态的任务) |
LinOSBitmap |
优先级位图(快速找到最高优先级任务) |
systemTicks |
系统时钟节拍计数(类似 SysTick) |
cpuUsage |
CPU使用率 |
idleCount, idleMaxCount |
用于 CPU 利用率计算 |
对于 _Task 任务结构,头文件中给出如下声明:
typedef struct _tTask {
/* stack保存了最后保存环境参数的地址位置,用于后续恢复 */
tTaskStack * stack;
/* 堆桟的起始地址 */
uint32_t *stackBase;
/* 堆桟大小 */
uint32_t stackSize;
/* 连接节点 */
tNode linkNode;
/* 任务延时计数器 */
uint32_t delayTicks;
/* 任务优先级 */
uint32_t prio;
/* 延时节点 */
tNode delayNode;
/* 当前任务状态 */
uint32_t state;
/* 当前剩余的时间片 */
uint32_t slice;
/* 挂起次数 */
uint32_t supendCount;
/* 任务删除时的清理函数 */
void (*clean) (void * param);
/* 传递给清理函数的参数 */
void * cleanParam;
/* 请求删除得标志 */
uint8_t requestsDeleteFlag;
/* 任务正在等待的事件类型 */
struct _tEvent * waitEvent;
/* 等待事件的消息存储位置 */
void * waitEventMsg;
/* 等待事件的结果 */
uint32_t waitEventResult;
/* 等待是件结果 */
uint32_t waitEventGroupType;
/* 等待事件标志 */
uint32_t waitEventGroupFlag;
}tTask;
typedef struct _tTaskInfo
{
/* 任务延时计时器 */
uint32_t delayTicks;
/* 任务优先级 */
uint32_t prio;
/* 任务当前状态 */
uint32_t state;
/* 任务剩余时间片 */
uint32_t slice;
/* 任务挂起次数 */
uint32_t supendCount;
/* 堆桟总容量 */
uint32_t stackSize;
/* 堆桟剩余量 */
uint32_t stackFree;
}tTaskInfo;